/**
 * 代号:隐无为 2017：厚溥
 * 文件名：UploadAction.java
 * 创建人：柯栋
 * 日期：2017年3月27日
 * 修改人：
 * 描述：
 */
package org.setone.common;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import org.apache.struts2.ServletActionContext;
import org.setone.model.House;
import org.setone.model.ImgArr;
import org.setone.service.ImgArrService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;


/**
 * 用途：上传模块
 */
@Controller
@Scope("prototype")
public class UploadAction extends BaseAction{
	private InputStream ip = null;
	private OutputStream op = null;
    
	private File file; // 上传的文件 （单图）
	private String fileFileName; // 上传的文件名称 （单图）
	private File []moreFile; // 上传的文件 （多图）
	private String []moreFileFileName; // 上传的文件名称（多图）
	private String path; // 上传的路径 ,如果路径没有,就会创建
	private String id;
	Map<String, Object> jsonMap = new HashMap<String, Object>();
	@Autowired
	ImgArrService imgArrService;
	
	/**
	 *  @功能:测试上传页面
	 *  @作者:柯栋 @代号:隐无为
	 *  @时间:2017年3月27日
	 *  @return  
	 */
	public String testUpload(){
		return "testUpload";
	}
	
	
	/**
	 *  @功能:测试上传页面 (硬盘)
	 *  @作者:柯栋 @代号:隐无为
	 *  @时间:2017年3月27日
	 *  @return  
	 */
	public String testUploadDisk(){
		return "testUploadDisk";
	}
	
	
	/**
	 * @功能: 上传文件 如:图片、excel、word.... 单文件上传
	 * @作者: 柯栋 @代号:隐无为
	 * @时间: 2017年3月27日
	 * @return
	 */
	public String uploadFile() {
		String imgPath = this.FileUpload(file, fileFileName, path);
		jsonMap.put("imgPath", imgPath);
		return "ajax";
	}
	/**
	 * @功能: 上传 到 硬盘
	 * @作者: 柯栋 @代号:隐无为
	 * @时间: 2017年3月27日
	 * @return
	 */
	public String uploadFileDisk() {
		String imgPath = this.FileUploadDisk(file, fileFileName, path, id);
		jsonMap.put("imgPath", imgPath);
		return "ajax";
	}
	
	/**
	 * @功能: 批量上传文件 如:图片、excel、word....
	 * @作者: 柯栋 @代号:隐无为
	 * @时间: 2017年3月27日
	 * @return
	 */
	public String uploadFiles() {
		List<String> list=new ArrayList<String>();
		for (int i = 0; i < moreFile.length; i++) {
			String imgPath = this.FileUploadDisk(moreFile[i], moreFileFileName[i], path,id);
			//保存进程
			ImgArr imgArr = new ImgArr();
			House house = new House();
			house.setId(id);
			imgArr.setHouse(house);
			imgArr.setImg_url(imgPath);
			imgArrService.save(imgArr);
 		}
		//查询进程
		List queryByHouseId = imgArrService.queryByHouseId(id);
		jsonMap.put("imgPath", queryByHouseId);
		return "ajax";
	}

	/**
	 * @功能: 获取imgPath地址
	 * @作者: 柯栋 @代号:隐无为
	 * @时间: 2017年3月27日
	 * @param file:文件
	 * @param fileName:文件名
	 * @param path:路径
	 * @return
	 */
	private String FileUpload(File file, String fileName, String path) {
		SimpleDateFormat sdf = new SimpleDateFormat("/yyyy/MM/dd/");
		String basePath = ServletActionContext.getServletContext().getRealPath(path);
		// 日期格式文件夹
		String datePath = sdf.format(new Date());
		// uuid随机名
		String uuidPath = UUID.randomUUID().toString();  
		// 文件的后缀名
		String fileExit = getFileExit(fileName);
		// 创建目录
		File dir = new File(basePath + datePath);
		if (!dir.exists()) {
			dir.mkdirs();
		}
		// 创建文件的路径
		String newFilePath = basePath + datePath + uuidPath + fileExit;
		// 数据库存储的文件相对项目的路径
		String returnName = path+datePath + uuidPath + fileExit;
		// 写入文件
		WriteFile(file, newFilePath);
		return returnName;
	}

	private String FileUploadDisk(File file, String fileName, String path, String id) {
		SimpleDateFormat sdf = new SimpleDateFormat("/yyyy/MM/dd/");
		String basePath = "D://tjh//upload" + path;
//		String basePath = "//usr//static" + path;//linux地址
		// 日期格式文件夹
		String datePath = sdf.format(new Date());
		// uuid随机名
		String uuidPath = UUID.randomUUID().toString();
		// 文件的后缀名
		String fileExit = getFileExit(fileName);
		// 创建目录
		File dir = new File(basePath + datePath);
		if (!dir.exists()) {
			dir.mkdirs();
		}
		// 创建文件的路径
		String newFilePath = basePath + datePath + uuidPath + fileExit;
		// 数据库存储的文件相对项目的路径
		String returnName = path+datePath + uuidPath + fileExit;
		// 写入文件
		WriteFile(file, newFilePath);
		return returnName;
	}

	
	
	/**
	 * @功能: 写入文件
	 * @作者: 柯栋 @代号:隐无为
	 * @时间: 2017年3月27日
	 * @param file 文件
	 * @param path 路径
	 */
	private void WriteFile(File file, String path) {

		try {
			ip = new FileInputStream(file);
			op = new FileOutputStream(path);
			byte[] bytes = new byte[1024];
			int len = 0;
			while ((len = ip.read(bytes)) > 0) {

				op.write(bytes, 0, len);
			}

		} catch (Exception e) {
			// TODO Auto-generated catch block
			throw new RuntimeException();
		} finally {
			if (ip != null) {
				try {
					ip.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} finally {
					try {
						ip.close();
					} catch (Exception e) {
						throw new RuntimeException(e);
					} finally {
						try {
							op.close();
						} catch (IOException e) {
							throw new RuntimeException(e);
						}
					}
				}

			}

		}

	}

	/**
	 * @功能: 获取后缀名
	 * @作者: 柯栋 @代号:隐无为
	 * @时间: 2017年3月27日
	 * @param fileName
	 * @return
	 */
	private String getFileExit(String fileName) {
		int index = fileName.lastIndexOf('.');
		return fileName.substring(index);
	}





	public File[] getMoreFile() {
		return moreFile;
	}

	public void setMoreFile(File[] moreFile) {
		this.moreFile = moreFile;
	}

	public String[] getMoreFileFileName() {
		return moreFileFileName;
	}

	public void setMoreFileFileName(String[] moreFileFileName) {
		this.moreFileFileName = moreFileFileName;
	}

	public String getPath() {
		return path;
	}

	public void setPath(String path) {
		this.path = path;
	}

	public Map<String, Object> getJsonMap() {
		return jsonMap;
	}

	public void setJsonMap(Map<String, Object> jsonMap) {
		this.jsonMap = jsonMap;
	}

	public File getFile() {
		return file;
	}

	public void setFile(File file) {
		this.file = file;
	}

	public String getFileFileName() {
		return fileFileName;
	}

	public void setFileFileName(String fileFileName) {
		this.fileFileName = fileFileName;
	}


	public String getId() {
		return id;
	}


	public void setId(String id) {
		this.id = id;
	}
	
	

}
